//BY ANTHONY CCAPIRA AVENDAÑO
import java.awt.SystemTray;
import java.io.*;
public class Calculadorapp {
	
	public static void main(String []args)throws IOException{
		fachada fa= new fachada();
		int op;
		BufferedReader writer = new BufferedReader(new InputStreamReader(System.in));
		float a=0,b=0;
		System.out.println("\n CALCULADORA by Anthony Ccapira Avendaño\n\n MENU OPERACIONES");
	
		do{
			op=menu();
			if(op<=4&&op>=1){
				System.out.print("\n Ingrese el Primer valor: ");
				a=Float.parseFloat(writer.readLine());
				System.out.print("\n Ingrese el segundo valor: ");
				b=Float.parseFloat(writer.readLine());
			}
			switch(op){
				case 1:
						fa.Calcular(a, b, '+');
					break;
				case 2:
						fa.Calcular(a, b, '-');
					break;
				case 3:
					 	fa.Calcular(a, b, '*');
					break;
				case 4:
						if(b==0)
							System.out.println("\n No se puede dividir entre cero\n");
						else
							fa.Calcular(a, b, '/');
					break;
				case 5:
					System.out.println("\n Adios.\n");
					break;
				default:
						System.out.println("\n Opcion incorrecta.\n");
					break;
			}
		}while(op!=5);
	}
	
	public static int menu()throws IOException{
		int op;
		BufferedReader writer = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("\n 1. Suma.\n 2. Resta.\n 3. Multiplicacion.\n 4. Division.\n 5. Salir.\n\n OPCION: ");
		op=Integer.parseInt(writer.readLine());
		return op;
	}
}

// COMPONENTES DEL SUBSISTEMA PARA EL PATRON FACADE,(el usuario no ve como funciona por detras el sistema)	
class Calculadora {

	float numeroa = 0;
	float numerob = 0;
	char operacion;
	private static Calculadora Scalculadora;

	
	// este metodo solo creará un único objeto Calculadora (singleton)
	public   static Calculadora get_objeto ( float val1, float val2,char ope) {
		if (Scalculadora == null){
				Scalculadora = new Calculadora();
				
		}
		Scalculadora.numeroa=val1;
		Scalculadora.numerob =val2;
		Scalculadora.operacion=ope;
		return Scalculadora;
	}
	private Calculadora(){}
   
	public float get_resultado(){

	   float resultado=0;
	   
	   switch(operacion){
	   
	   		case '+':
	   			Suma s = new Suma();
	   			resultado = s.get_suma(numeroa,numerob);
	   			break;
	   		case '-':
	   			Resta r = new Resta();
	   			resultado = r.get_resta(numeroa,numerob);
	   			break;
	   		case '/':
	   			Division d = new Division();
	   			resultado = d.get_div(numeroa,numerob);
	   			break;
	   		case '*':
	   			
	   			Multiplicacion  m = new Multiplicacion();
	   			resultado = m.get_mul(numeroa,numerob);
	   			break;

	   	}
	   return resultado;
	}

}

//clase que suma
class Suma {

	public float get_suma(float a,float b){
	      return a + b;
	}
}

//clase que resta
 class Resta{

	public float get_resta(float a,float b){
		return a-b;
	}
}

//clase que multiplica
 class Multiplicacion {

	public float get_mul(float a,float b){
	      return a * b;
	}
}

//clase que divide
 class Division{

	public float get_div(float a,float b){
			return a/b;
	}
}
//clase Facade (fachada) Interfaz para el usuario o el cliente

 class fachada{

		public void Calcular(float a, float b, char operacion){
		    System.out.println("\n A continuacion se va a realizar una: " + operacion);
		    Calculadora cal =  Calculadora.get_objeto(a,b,operacion); //aqui se usa singleton
		    System.out.println("\n El resultado de la operacion es: " + cal.get_resultado());
		}

}
